草庐IT

C++ 对和指针

全部标签

c++ - 为什么在 C++ 中虚拟函数表指针 (vfptr) 不能是静态的?

如果类的所有对象的虚函数表都是相同的,那么为什么指向该表的指针(vfptr)不能是静态的并在所有对象之间共享? 最佳答案 vtable本质上是静态的。但是您需要一个实际位于对象内部的vptr成员来执行虚拟分派(dispatch)和其他RTTI操作。在vptr实现上,此C++代码:classBase{public:virtualvoidf();};classDerived:publicBase{public:virtualvoidf();};可能会像下面这样:classBase{public:Base::Base():m_vptr(&

c++ - 编译器关于此指针、虚函数和多重继承的详细信息

我正在阅读Bjarne的论文:MultipleInheritanceforC++.在第3节第370页中,Bjarne说“编译器将成员函数的调用转换为带有“额外”参数的“普通”函数调用;该“额外”参数是指向成员函数所针对的对象的指针叫做。”我对这个额外的论点感到困惑。请看以下两个例子:示例1:(第372页)classA{inta;virtualvoidf(int);virtualvoidg(int);virtualvoidh(int);};classB:A{intb;voidg(int);};classC:B{intc;voidh(int);};类c对象C看起来像:C:---------

c++ - 如何过早销毁智能指针

我有一个类有一个setter方法,它接受一个unique_ptr作为参数。该unique_ptr被保存为类成员。classTestClass{std::unique_ptrsp;voidsetTester_Way1(std::unique_ptrte){autodeleter=std::move(sp);sp=std::move(te);}voidsetTester_Way2(std::unique_ptrte){sp=std::move(te);}};哪种方式才是正确设置智能指针的方式?Way2是否泄露了sp的原始指针? 最佳答案

c++ - 比较 typeid 指针

在这个程序中,我使用typeid来检查对象的派生类型:#include#include#include#include#includestructWrap{explicitWrap(int64_tid):mImpl(newImpl(id)){}explicitWrap(std::stringid):mImpl(newImpl(std::move(id))){}boolisInt64()const{constImplBase&impl=*mImpl;return(&typeid(impl)==&typeid(constImpl));}boolisString()const{constIm

c++ - 如何从指向方法的指针获取类(对象类型)

我有一个指向方法的指针:structA{intmethod(){return0;}};autofn=&A::method;我可以通过std::result_of获取返回类型,但是如何从fn获取方法的类所有者? 最佳答案 试试这个:templatestructMethodInfo;templatestructMethodInfo//methodpointer{typedefCClassType;typedefRReturnType;typedefstd::tupleArgsTuple;};templatestructMethodInf

c++ - 静态类或实例指针

背景故事:目前我有一系列与游戏相关的三个类(class)。我之前使用Unity制作过游戏,您可以使用在所有代码中都可访问的函数来访问相机等组件。然而,我当前的设置依赖于每个类的实例被发送到其他类。请参阅以下摘录:classWorld{};classGame{Camera*camera;World*world;};classCamera{Game*game;World*world;};问题:这是糟糕设计的结果,还是有时像这样的设置这有道理吗?我是否应该使用静态类而不是当前设置,因为它会澄清代码,每个类的实例不超过一个用过吗?使用静态类的可能缺点是什么实例?编辑:为什么他们需要互相访问。为

c++ - 在现代 C++ 中使用原始指针是不好的做法吗?

我想保存一个没有对象切片的Base类实例的vector(这样我也可以毫无问题地存储Base的子实例)同时保持多态行为而不通过复制值添加到列表,而是通过引用。考虑以下源文件:#include#include#include#includeclassEntity{public:Entity(){this->edited=false;}virtualstd::stringname()=0;booledited;};classPlayer:publicEntity{public:Player():Entity(){}std::stringname(){return"player";}};int

C++,函数指针异常错误

我收到以下代码的“错误:不允许超出单一间接级别的异常规范”。请指出标准中不允许的部分。我想确定它确实是语言所必需的,或者只是编译器特定的错误。如果它来自语言规范,那么这条规则的动机是什么?我正在使用clang3.8.0。intmain(){void(**fp)()throw();} 最佳答案 你说:Pleasepointmetoareferencebook/specthatsaysthatitisnotallowed.Iwanttobesurethatitisreallyrequiredbythelanguageorjustcomp

c++ - 在不知道是哪个类的情况下调用C++成员函数指针

我正在尝试调用一个成员函数,可能给定了对象指针,但不知道该成员函数来自哪个类。这可能吗?基本上我想要像下面这样的东西工作。classFoo{public:Foo(void*object):obj(object){}voidcallFunc(void(*func)()){obj->*func();}private:void*obj;};classBar{public:Bar():foo(this){}voidcallSomeFunc(){callFunc(someFunc);}voidsomeFunc(){cout 最佳答案 它看起来

c++ - 打包和指针别名,C 和 C++

unionvec{#pragmapack(push,1)struct{floatx,y,z;}#pragmapack(pop)floatvals[3];};考虑上面的定义。(除了C99中的匿名union)我想这个答案可能允许不同的答案,具体取决于编译器的选择、语言的选择和标准的选择。我相信我可以保证(通过#pragma编译器文档,而不是语言保证)sizeof(vec)==3*sizeof(float)因此,我相信我可以保证&vec.x==&vec.vals[0]等。但是,我不确定从v.x写入然后从v.vals[0]读取是否合法(也就是说,不允许通过严格的别名)>撇开包装不谈,我相信相关